//
//  QCErrorController.swift
//  爱汽车
//
//  Created by tucici on 2023/8/27.
//

import UIKit

// 以下是原始的业务逻辑
private let textArr1 = ["系统未自检", "加速度传感器故障", "电池电压过高", "电池电压过低", "气泵1温度传感器故障", "气泵2温度传感器故障", "系统温度传感器故障"]
private let textArr2 = ["左前高度传感器超量程", "None", "左前高度传感器线序错误", "左前高度传感器测量范围过小", "左前高度传感器装反", "左前高度传感器故障", "左前气压传感器故障", "左前空气弹簧漏气"]
private let textArr3 = ["右前高度传感器超量程", "None", "右前高度传感器线序错误", "右前高度传感器测量范围过小", "右前高度传感器装反", "右前高度传感器故障", "右前气压传感器故障", "右前空气弹簧漏气"]
private let textArr4 = ["左后高度传感器超量程", "None", "左后高度传感器线序错误", "左后高度传感器测量范围过小", "左后高度传感器装反", "左后高度传感器故障", "左后气压传感器故障", "左后空气弹簧漏气"]
private let textArr5 = ["右后高度传感器超量程", "None", "右后高度传感器线序错误", "右后高度传感器测量范围过小", "右后高度传感器装反", "右后高度传感器故障", "右后气压传感器故障", "右后空气弹簧漏气"]
private let textArr6 = ["气压传感器故障", "气压传感器故障", "气泵温度过高", "气罐无法充气", "气泵状态异常"]
private let arr = [textArr1, textArr2, textArr3, textArr4, textArr5, textArr6]
class QCErrorController: QCViewController {
    var array = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()
        initUI()
    }
    
    override func initUI() {
        title = LS("通知中心")
        let rightBtn = UIButton(type: .custom)
        rightBtn.setTitle(LS("一键清除"), for: .normal)
        rightBtn.setImage(UIImage(named: "清除"), for: .normal)
        rightBtn.setTitleColor("#AEAEAE".color(), for: .normal)
        rightBtn.titleLabel?.font = font(14)
        rightBtn.frame = CGRect(x:0, y:kUIStatusBarHeight + 5, width: 30, height: 34)
        rightBtn.addTarget(self, action: #selector(rightBtnAction), for: .touchUpInside)
        let rightItem = UIBarButtonItem(customView: rightBtn)
        self.navigationItem.rightBarButtonItems = [rightItem]
        
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(QCSettingCell.nib(), forCellReuseIdentifier: QCSettingCell.ID())
        tableView.snp.makeConstraints { make in
            make.left.right.top.equalToSuperview()
            make.bottom.equalToSuperview().inset(KUITabBarHeight)
        }
    }
    
    override var base_info: [UInt8]{
        didSet{
            let data = [UInt8](base_info[AI_index..<base_info.count])
            let errors = [Int(data[31]),Int(data[32]),Int(data[33]),Int(data[34]),Int(data[35]),Int(data[36])]
            QCErrorController.jude(errors,{[weak self]  result in
                self?.array = result
                self?.tableView.reloadData()
            })
        }
    }
    
    //方法1:  用 并行异步 + 信号量，来控制并发的执行(可以并行执行任务，性能较好，但需要小心处理信号量，避免死锁)
    //方法2；加锁（非常简单直观，但会导致性能瓶颈，因为每次任务都必须等到锁被释放。）
    //    let lock = NSLock()
    //    DispatchQueue.global().async {
    //        lock.lock() // 加锁
    //        // 执行任务
    //        lock.unlock() // 释放锁
    //    }
    private static let semaphore = DispatchSemaphore(value: 1)
    class func jude(_ codeArray: [Int], _ resultBlock: @escaping ([String]) -> Void) {
        DispatchQueue.global().async {
            semaphore.wait() //信号量的计数会减 1。如果计数为 0，线程会被阻塞
            defer {//注册在当前作用域退出时执行的代码。它确保这些代码会在当前作用域结束时被执行
                semaphore.signal()//释放信号量并使计数恢复为 1，允许下一个任务执行
            }
            
            var result = [String]()
            for i in 0..<codeArray.count {
                let code = codeArray[i]
                for j in 0..<arr[i].count {
                    let msg = arr[i][j]
                    let bit = (code & (1 << j)) >> j
                    if bit == 1 && !result.contains(msg) {
                        result.append(arr[i][j])
                    }
                }
            }
            
            DispatchQueue.main.async {
                resultBlock(result)
            }
        }
    }
    
 
    @objc func rightBtnAction(){
        let vc = QCAlertPopViewController(useXib: true)
        vc.show("是否全部清除？")
        vc.rightBtnBlock = {[weak self] in
            self?.array.removeAll()
            self?.tableView.reloadData()
            BLEData.appSetDataToPer(AIQC.clearWarning.cmd, "00").write
        }
    }
}

//MARK: - UITableViewDataSource
extension QCErrorController : UITableViewDataSource
{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: QCSettingCell.ID()) as! QCSettingCell
        cell.title.text = LS(array[indexPath.row])
        cell.img.image = UIImage(named: "异常")
        cell.subImg.isHidden = true
        return cell
        
    }
}
//MARK: - UITableViewDelegate
extension QCErrorController : UITableViewDelegate
{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
    }
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0
    }
    
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 0
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return nil
    }
    
    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return nil
    }
}
